#include"blockQueue.hpp"
// #include"task.hpp"
#include<functional>
#include<ctime>

using namespace zdl;
// using namespace Task;

using task_t  = std::function<void()>;


void task()
{
    std::cout << "task is running..." << std::endl;
}

void hello()
{
    std::cout << "hello world!" << std::endl;
}

int main()
{
    srand(time(nullptr) ^ getpid()); // 随机数种子
    auto* bq = new blockQueue<task_t>(5);  // 共享资源
    auto consumer = 
    [](void* args) ->void*
    {
        auto bq = static_cast<blockQueue<task_t>*> (args);
        // zdl:: 消费者一定要拿到自己想要的数据去！！！
        // int data;
        while (true)
        {
            auto t = bq->pop();
            // t.execute(); // 执行任务
            sleep(1);
            t();
            // std::cout << "consumer dealed a task : "  
            // << t._x() << "+" << t._y() << "= " << t._ret() << std::endl;
            std::cout << "Consumer get a task and deal it !" << std::endl;
        }
        return nullptr;
    };
    auto producter = 
    [](void* args) ->void*
    {
        auto bq = static_cast<blockQueue<task_t>*> (args);
        int data = 10;
        while (true)
        {

            // int a = rand() % 10 + 1;
            // int b = rand() % 20 + 1;
            // task t(a, b);
            // sleep(2);
            // zdl:: 生产者一定要重别的地方拿到相应的数据
            bq->equeue(task);
            // std::cout << "生产了一个数据: "  << data << std::endl;
            // std::cout << "生产了一个任务: "  << t._x() << "+" 
            // << t._y() << "=?" << std::endl;
            std::cout << "Productor producted a task !" << std::endl;
            data++;
        }
        return nullptr;
    };
    // zdl:: 任务队列的实现需要队列

    //  ! 交易场所不知可以传递数，还可以传递任务
    pthread_t c, /*c1, p,*/ p; // 消费者和生产者    
    pthread_create(&c, nullptr, consumer, bq);
    pthread_create(&p, nullptr, producter, bq);

    pthread_join(c, nullptr);
    pthread_join(p, nullptr);
    delete bq;
    return 0;
}

